// 发送验证码配置参数  
/* 
    // 需要验证号码类型  手机号码 或者 邮箱
    codeType: "phone" || "email",
    // 验证码关联号码value #required
    codeValue: "",          
    // 计时最大时间
    maxTime: 60,
    // 发送状态  默认 未发送状态 #required
    sendState: false,       
    // 是否发送过验证码 #required
    sendAuto: false,        
    // 默认按钮显示文本 #required
    startText: "获取验证码", 
    // 发送过之后显示文本
    endText: "重新发送" ,
    // 发送成功后 接受的验证码 value 忽略   可以在回调中进行自由赋值
    sendValue:"",
    // 请求函数
    fetchFun:"",
    
*/

export default function sendCode(configParams) {
  if (configParams) {
    this.init(configParams || {});
    return this;
  }
}

Object.assign(sendCode.prototype, {
  init(configParams) {
    if (this.leftInterval !== null) {
        clearInterval(this.leftInterval);
    }
    
    Object.assign(
      this,
      {
        codeType: "phone",
        codeValue: "",
        startText: "获取验证码",
        sendState: false,
        maxTime: 60,
        sendValue: "",
        endText: "重新获取",
        fetchFun: null,
        leftTime: 0,
        leftInterval: null,
      },
      configParams
    );

    if (!this.fetchFun) {
        throw Error("config param fetchFun is must be required");
    }
    return this
    
  },
  send(sendValueParam) {
    return new Promise((resolve, reject) => {
      const sendCodeValue = sendValueParam || this.codeValue;
      // 判断号码存在
      if (sendCodeValue) {
        // 获取 page对象
        if (this.fetchFun) {
          return this.fetchFun(sendCodeValue)
            .then((res) => {
              // 请求成功后把  data传给回调函数
              // 同时开始倒计时
              this.leftTime = this.maxTime;
              this.leftInterval = setInterval(function () {
                this.startText = `剩余 ${this.leftTime - 1}s`;
                if (this.leftTime) {
                  this.leftTime--;
                } else {
                  clearInterval(this.leftInterval);
                  this.leftInterval = null;
                  this.startText = this.endText || "重新发送";
                  this.sendState = false;
                }
              }, 1000);
              this.startText = `剩余 ${maxTime}s`;
              this.sendAuto = true;
              this.sendState = true;
              // 执行回调函数操作返回的数据及其他操作
              resolve(this);
            })
            .catch((err) => {
              reject(err);
            });
        }
      } else {
        reject(`请输入${codeText}号码`);
      }
    });
  },
});
